package main

import (
	"fmt"
	"math/rand"
	"sort"
	"time"
)

func main() {
	//1 s1 := make([]int,3,4)
	//  s2 := append(s1,1)

	//请问s1、s2内各有什么元素？
	//答:s1的切片是 [0 0 0] s2的切片是 [0 0 0 1]
	//s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
	//答:不会影响s2的追加，s2 修改的元素不会影响到s1
	//s2再增加一个元素会怎么样？
	//答:那么切片将会经行扩容,那么切片的cap会翻倍成8
	//2 有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
	s1 := [...]int{1, 4, 9, 16, 2, 5, 10, 15}
	s2 := make([]int, 0, 6)
	//fmt.Println(s1)
	var a int
	var b int
	var v int
	//for _, v := range s1 {
	//	v, a = a, a+v
	//	b = a
	//	s2 = append(s2, b)
	//	fmt.Println(s2)
	//}
	for i := 0; i < len(s1)-1; i++ {
		a = s1[i]
		b = s1[i+1]
		v = a + b
		s2 = append(s2, v)
	}
	fmt.Println(s2)
	//3 数字重复统计
	//随机产生100个整数
	//数字的范围[-100, 100]
	//降序输出这些生成的数字并打印其重复的次数
	rand.Seed(time.Now().UnixNano())
	s4 := make([]int, 0, 100)
	for i := 0; i < 100; i++ {
		r := rand.Intn(201) - 100
		s4 = append(s4, r)
	}
	fmt.Println(s4)
	sort.Sort(sort.Reverse(sort.IntSlice(s4)))
	fmt.Println(s4)
	for _, v := range s4 {
		a := v
		c := 0
		for i := 0; i < 99; i++ {
			if a == s4[i] {
				c++
			}
		}
		if c > 1 {
			fmt.Println(a, "重复", c)
		}
	}

	//4、简述线性数据结构和哈希表优劣
	//线性数据结构
	//优势:
	//1 可索引
	//2 值类型，不会修改最初的数据
	// 劣势:
	//1 查询该线性数据结构中是否有某个值是否有为需要的，需要遍历整个线性表
	//2 如果在首部和中间插入，会造成大量的数据迁移
	//哈希表
	//优势:
	//1 通过key 快速找到所要的value
	//2 key是唯一的，去重的
	//劣势：
	//内存占用相对较高
}
